package com.hb.trade.server.project.section.service.raw;

import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hb.core.pojo.parent.PageResult;
import com.hb.core.pojo.project.evaluation.vo.EvaluationProjectAndSectionInfoVO;
import com.hb.core.pojo.project.homepage.dto.StatisticUserParam;
import com.hb.core.pojo.project.homepage.vo.BidSectionStatisticVO;
import com.hb.core.pojo.project.notice.dto.TenderInviteEnterpriseDTO;
import com.hb.core.pojo.project.proj.dto.BidProjectDTO;
import com.hb.core.pojo.project.proj.entity.AbstractProject;
import com.hb.core.pojo.project.section.dto.BidSectionDTO;
import com.hb.core.pojo.project.section.dto.SupplyBidSignupDTO;
import com.hb.core.pojo.project.section.entity.BidSection;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

/**
 * 采购方案/标段(包)信息表 服务类
 *
 * @author zhaojk
 * @since 2021-08-30
 */
public interface BidSectionService extends IService<BidSection> {

    /**
     * @param projectId: 项目id
     * @Description: 根据项目查询已经发布过公告(除控制价公告)的的标段列表
     * @Author: zhongdl
     * @Date:2021/12/27 14:57
     * @return: {@link List< BidSection> }
     **/
    List<BidSection> listReleaseNotice(Long projectId);

    /**
     * 根据项目id查询所有的标段
     *
     * @param projectId
     * @return
     */
    List<BidSectionDTO> findByProjectId(Long projectId);

    /**
     * 根据公告的id去查询所有的标段售价
     *
     * @param noticeId
     * @return
     */
    List<JSONObject> findSectionPriceByNoticeId(Long noticeId);

    /**
     * 保存标段信息
     * 若标段中带有ID字段, 则更新数据
     *
     * @param projectId   项目ID
     * @param projectCode 项目编号
     * @param sections    标段
     * @return
     */
    boolean saveSections(Long projectId, String projectCode, List<BidSectionDTO> sections);

    /**
     * 保存标段信息
     * 若标段中带有ID字段, 则更新数据
     *
     * @param projectId         项目ID
     * @param projectCode       项目编号
     * @param tenderProjectCode 招标项目编号
     * @param sections          标段
     * @return
     */
    boolean saveSections(Long projectId, String projectCode, String tenderProjectCode, List<BidSectionDTO> sections);

    /**
     * 保存标段信息
     * 若标段中带有ID字段, 则更新数据
     *
     * @param projectId         项目ID
     * @param projectCode       项目编号
     * @param tenderProjectCode 招标项目编号
     * @param signUpFlag 是否报名
     * @param sections          标段
     * @return
     */
    boolean saveSections(Long projectId, String projectCode, String tenderProjectCode, Integer signUpFlag, List<BidSectionDTO> sections);

    /**
     * 根据公告id去查询所有的标段信息
     *
     * @param noticeId
     * @return
     */
    List<BidSectionDTO> findSectionBondByNoticeId(Long noticeId);

    /**
     * 查询指定公告下的标段列表
     *
     * @param noticeId
     * @return
     */
    List<BidSectionDTO> getSectionsByNoticeId(Long noticeId);

    /**
     * 根据标段id查询标段信息和项目信息
     *
     * @param sectionId
     * @return
     */
    BidSectionDTO findBidAndProjectBySectionId(Long sectionId);

    EvaluationProjectAndSectionInfoVO bidProjectAndSectionInfoBySectionId(Long sectionId);

    /**
     * 通过指定的标段ID查询所有标段信息(卧槽 ? ? ?)
     *
     * @param sectionId
     * @return
     */
    List<BidSection> listSections(Long sectionId);

    /**
     * 根据标段id查询最高限价信息
     *
     * @param sectionId
     * @return
     */
    List<BidSection> findLimitConfigInfoBySectionId(Long sectionId);

    /**
     * 获取指定标段的项目ID
     *
     * @param sectionId
     * @return
     */
    Long getProId(Long sectionId);

    /**
     * 获取当前所有的标段信息
     * 临时用于异议投诉功能的标段选择列表
     *
     * @return
     */
    List<BidSectionDTO> allSections();

    /**
     * 获取操作台按钮列表
     *
     * @param statusId 标段状态ID
     * @param roleSign 当前登陆用户所属机构类别（采购商/供应商/代理机构）
     * @param bidWay   当前标段对应项目的招标方式, 该字段为空时取sectionId标段对应的项目类型
     * @return 前端可渲染的树形结构
     */
    List<JSONObject> listConsoleItems(Long statusId, Integer roleSign, Integer bidWay);


    /**
     * 根据项目id 查询标段
     *
     * @param bidSectionDTO
     * @return
     */
    Page<BidSectionDTO> selectListByProjectId(BidSectionDTO bidSectionDTO);

    /**
     * @param bidSection: {pageFlag:是否返回分页对象}
     * @Description: 查询标段列表
     * @Author: zhongdl
     * @Date:2021/12/15 16:00
     * @return: {@link Object }
     **/
    Object findBidSectionList(BidSectionDTO bidSection);

    /**
     * @param bidSection: 根据
     * @Description: 分页查询标段列表 传fileId 就查招标文件下的标段 传项目id就查项目id下的标段
     * @Author: zhongdl
     * @Date:2021/12/15 16:05
     * @return: {@link com.hb.core.pojo.parent.PageResult< BidSection> }
     **/
    PageResult<BidSection> pageBidSectionDTO(BidSectionDTO bidSection);

    /**
     * @param bidSection:
     * @Description: 查询标段列表 传fileId 就查招标文件下的标段 传项目id就查项目id下的标段
     * @Author: zhongdl
     * @Date:2021/12/15 16:29
     * @return: {@link List< BidSection> }
     **/
    List<BidSection> findBidSectionArr(BidSectionDTO bidSection);

    /**
     * 插叙指定公告下的标段列表
     *
     * @param noticeId
     * @return
     * @update zhaojk
     */
    List<BidSectionDTO> findBidSectionsByNoticeId(Long noticeId);

    /**
     * @param bidSection:
     * @Description: 投标人查询项目大厅列表
     * @Author: zhongdl
     * @Date:2021/12/31 16:22
     * @return: {@link PageResult< BidSectionDTO> }
     **/
    PageResult<BidSectionDTO> pageProjectHall(BidSectionDTO bidSection);

    /**
     * @param bidSection:
     * @param type:1      项目大厅条件 2 我的项目条件
     * @Description:投标人我的项目 (1):需要报名的项目 报名成功 到 我的项目
     * (2 ):不需要报名的项目需要购买文件  购买完文件 到我的项目
     * (3 ): 不需要报名的项目不要购买文件 下载完文件 到 我的项目
     * @Author: zhongdl
     * @Date:2022/1/4 9:06
     * @return: {@link PageResult< BidSectionDTO> }
     **/
    PageResult<BidSectionDTO> pageMyProject(BidSectionDTO bidSection, Integer type);

    /**
     * 根据项目Id查询标段列表分页(报名管理处调用)
     *
     * @param page
     * @param projectId
     * @return
     */
    PageResult<SupplyBidSignupDTO> pageSectionListByProjectId(Page page, Long projectId);


    /**
     * 根据项目Id查询标段列表分页(邀请书管理处调用)
     *
     * @param page
     * @param projectId
     * @return
     */
    PageResult<TenderInviteEnterpriseDTO> pageInvitationSectionListByProjectId(Page page, Long projectId);

    /**
     * @param id:
     * @Description: 标段取消关联招标文件
     * @Author: zhongdl
     * @Date:2022/1/13 9:37
     * @return: {@link Boolean }
     **/
    Boolean cancelRelateFile(Long id);

    /**
     * 根据企业ID和项目名查询全部 项目和标段（投诉异议模块使用）
     *
     * @param bidProjectDTO
     * @return
     * @Author: ljs
     * @Date:2022-2-8 10:30:54
     */
    List<AbstractProject> listMySection(BidProjectDTO bidProjectDTO);

    /**
     * @param id:
     * @Description: 根据标段id查询参加该项目的投标人
     * @Author: zhongdl
     * @Date:2022/2/18 18:15
     * @return: {@link List< Long> }
     **/
    List<Long> listParticipateSection(Long id);

    /**
     * 根据月份查询 具有开标安排的日期
     *
     * @param bidSectionDTO
     * @return
     */
    List<BidSectionDTO> openDateList(BidSectionDTO bidSectionDTO);

    /**
     * 根据企业ID查询未递交投标文件的标段
     *
     * @param bidSectionDTO
     * @return
     * @Author: ljs
     * @Date:2022-2-18 18:17:52
     */
    Page<BidSectionDTO> pageNotSubmitSection(BidSectionDTO bidSectionDTO);

    /**
     * @param bidSectionDTO:
     * @Description:根据开标时间查询标段列表
     * @Author: zhongdl
     * @Date:2022/2/19 11:15
     * @return: {@link List< BidSectionDTO> }
     **/
    List<BidSectionDTO> listBidSectionByOpenBidTime(BidSectionDTO bidSectionDTO);

    /**
     * 获取标段的基本信息
     *
     * @param id
     * @return com.hb.core.pojo.project.section.dto.BidSectionDTO
     * @author tian
     * @date 2022-2-21 15:20
     */
    BidSectionDTO findBidSectionInfoById(Long id);

    List<BidSectionDTO> listBidSectionByClarify(Long clarifyId);

    /**
     * 更新指定招标文件ID下的标段状态
     *
     * @param fileId
     * @return
     */
    boolean refreshSectionStatusByFileId(Long fileId);

    /**
     * 更新指定公告下的标段状态
     *
     * @param noticeId
     * @return
     */
    boolean refreshSectionStatusByNoticeId(Long noticeId);

    /**
     * 更新指定标段的状态
     *
     * @param fileId
     * @return
     */
    boolean refreshSectionStatus(Long sectionId);

    /**
     * 根据项目id 查询所有通过报名的企业(门户使用)
     *
     * @param projectId
     * @return
     * author：lsj
     */
    List<String> getTenderOrgByProjectId(@RequestBody String projectId);


    /**
     * 根据项目id 查询标段的递交数量
     *
     * @param bidSectionDTO
     * @return
     */
    Page<BidSectionDTO> listSubmitInfoByProjectId(BidSectionDTO bidSectionDTO);

    /**
     * 根据招标文件查询关联的标段
     *
     * @author yuezheng
     * @param fileId
     * @return List<BidSectionDTO>
     * @date 2022/4/21 5:48 PM
     */
    List<BidSection> selectSectionByBidFileId(Long fileId);

    /**
     * 首页的项目数量统计
     * @param statisticUserParam
     * @return
     */
    BidSectionStatisticVO homepageSectionStatistic(@RequestBody StatisticUserParam statisticUserParam);


    /**
     * 查询标段的招标形式
     * @author tian
     * @date 2022-4-20 10:27
     * @param sectionId
     * @return java.lang.Integer
     */
    Integer selectBidWayBySectionId(Long sectionId);

    /**
     * @Description: 查询邀请书标段列表
     *
     * 需要添加选中标记回显
     * 选中的标段默认拍到最前
     *
     * @author yuezheng
     * @param bidSectionDTO
     * @return java.util.List
     * @date 2022/6/27 16:19
     */
    List getBidSectionList(BidSectionDTO bidSectionDTO);

    /**
     * @Description: 根据标段ID集合查询标段详情 附带该标段是否开标(openFlag)
     *
     * @author yuezheng
     * @param sectionIdList
     * @return java.util.List<com.hb.core.pojo.project.section.entity.BidSection>
     * @date 2022/6/27 16:21
     */
    List<BidSection> findBidSectionList(List<Long> sectionIdList);
}
